package com.wx.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.wx.constant.MessageConstant;
import com.wx.entity.Result;
import com.wx.service.OrderService;
import com.wx.utils.SMSUtils;
import com.wx.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 预约订单处理
 */
@RestController
@RequestMapping("/pages/order")
public class MorderController {
    @Reference
    private OrderService orderService;
    @Autowired
    private JedisPool jedisPool;

    /**
     * 发送验证码短信给用户
     * 短信类型+客户的电话号码作为key
     * 生成的验证码作为value保存到redis中
     * 设置存在时间为5分钟，在客户提交预约的时候从redis中获取，
     * 如果获取不到就预约失败
     * @param tel
     * @return
     */
    @RequestMapping("/validate")
    public Result sendShortMessage(String tel){
        // 生成验证码
        Integer integer = ValidateCodeUtils.generateValidateCode(4);
        String value=integer.toString();
        // TODO 假装发了短信验证，并且成功
        String key= SMSUtils.VALIDATE_CODE+tel;
        jedisPool.getResource().setex(key,60*5,value);
        System.out.println("验证码是："+integer);
        return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS,value);
    }
    /**
     * 完成验证并且预约
     */
    @RequestMapping("/commit")
    public Result commitOrder(@RequestBody HashMap map){
        String telephone = (String) map.get("telephone");
        String validateCode = (String) map.get("validateCode");
        //获得存在redis中的值
        String key=SMSUtils.VALIDATE_CODE+telephone;
        //判断验证码是否正确
        String value = jedisPool.getResource().get(key);
        if(validateCode.equals(value)){
            // 验证通过,返回添加预约的主键
            Result result = orderService.addOrder(map);
            return  result;
        }else {
            // 验证失败
            return new Result(false,MessageConstant.VALIDATECODE_ERROR);
        }

    }

}
